/*
 * CTRL_EstudianteSolicitaSerAyudante.java
 *
 * Created on 22 de octubre de 2007, 05:50 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarSerAyudante;

import web.util.Constantes;
import com.sun.rave.web.ui.model.UploadedFile;
import entidad.Estudiante;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import hero.interfaces.BnNodeValue;
import hero.interfaces.UserRegistration;
import java.io.File;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import wasolicitudesfiec.Ayudantias.SolicitarSerAyudante.EstudianteSolicitaSerAyudante;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;

/**
 *
 * @author kabad
 */
public class CTRL_EstudianteSolicitaSerAyudante extends CTRL_Base {

    private final String nombreProceso = Constantes.Modelo.modelo_SolicitarSerAyudante;
    private final String nombreProcesoProf = Constantes.SolicitarAyudantes.solicitarAyudantes;
    private final String nombreActividadRegistro = Constantes.SolicitarAyudantes.registroEstudiantes;
    private EstudianteSolicitaSerAyudante gui;
    private UserRegistration userRegistration;

    /** Creates a new instance of CTRL_EstudianteSolicitaSerAyudante */
    public CTRL_EstudianteSolicitaSerAyudante(EstudianteSolicitaSerAyudante gui, ExternalContext externalContext, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        userRegistration = logica.getUserRegistration();
        String instanciaProf;
        instanciaProf = (String) externalContext.getRequestParameterMap().get("instProceso");
        if (instanciaProf != null) {
            externalContext.getSessionMap().put("instancia", instanciaProf);
        }
    }

    public void inicializar() throws MensajeException {
        gui.getLabel4().setVisible(true);
        gui.getFileUpload1().setVisible(true);
        gui.getMenu().setTitulo(nombreProceso );
        mostrarSolicitudAyudantia();
    }

    private void mostrarSolicitudAyudantia() throws MensajeException {
        String nombreInstanciaSolicitarAyudantes;
        Solicitudayudantia solicitudAyudantia;
        BnNodeValue actividad;
        TipoAyudantia tipoAyudantia;
        try {
            nombreInstanciaSolicitarAyudantes = getNombreInstanciaSolicitarAyudantes();
            this.inicializarInstancia(nombreInstanciaSolicitarAyudantes);
            actividad = usrSession.getNode(nombreInstanciaSolicitarAyudantes, nombreActividadRegistro);
            System.out.println(actividad.getDescription());
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY))) {
                throw new Exception();
            }
            System.out.println("idsolicituDproceso:  " + prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitud);
            tipoAyudantia = logica.leerTipoAyudantia(solicitudAyudantia);
            if (tipoAyudantia.getTipo() == TipoAyudantia.TipoAyudantiaEnum.ACADEMICA) {
                gui.getLabel1().setText(tipoAyudantia.getNombre() + ": " + solicitudAyudantia.getMateria().getNombre());
            } else {
                gui.getLabel1().setText(tipoAyudantia.getNombre() + ": " + solicitudAyudantia.getAyudantiavaria().getNombre());
            }

            String nombreProfesor;
            nombreProfesor = solicitudAyudantia.getProfesor().getPersona().getTituloAcademico() + " " + solicitudAyudantia.getProfesor().getPersona().getNombres() + " " + solicitudAyudantia.getProfesor().getPersona().getApellidos();
            gui.getLabel7().setText(nombreProfesor);
            gui.getTxtAActividad().setText(solicitudAyudantia.getActividadarealizar());
             if (solicitudAyudantia.getRequisitosAdicionales()!=null) {
                   gui.getTextArea1().setText(solicitudAyudantia.getRequisitosAdicionales());
                } else {  gui.getTextArea1().setText("Sin requisitos adicionales");
                   
           }
            if (!solicitudAyudantia.getRequiereAdjunto()) {
                gui.getLabel12().setRendered(false);
                gui.getFileUpload1().setRendered(false);
            }
            gui.getLabel6().setText(solicitudAyudantia.getFechaMaxRegistro());
            String convocatoria=logica.getLogAyudantia().generarConvocatoria(solicitudAyudantia).replaceAll("(\r\n|\r|\n|\n\r)", "\\\\n");
            convocatoria=convocatoria.replaceAll("<br/>", "\\\\n");
            gui.setConvocatoria(convocatoria);
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_EstudianteSolicitaSerAyudante.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noInicia);

        }
    }

    public String getNombreInstanciaSolicitarAyudantes() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");

        return instancia;
    }

    public boolean expiroAyudantia() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        try {
             nombreInstanciaProceso = getNombreInstanciaSolicitarAyudantes();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividadRegistro);
            if (actividad == null) {
                throw new Exception();
            }
            boolean expiro = (actividad.getState() == hero.interfaces.Constants.Nd.TERMINATED);
            if(expiro){
                throw new MensajeException("El tiempo para aplicar a la ayudantía ha finalizado.");
            }
            return expiro;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_EstudianteSolicitaSerAyudante.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public boolean guardarActividad() throws MensajeException {
        String nombreInstanciaProceso;
        String nombreInstanciaProcesoProf;
        BnNodeValue actividad;
        Solicitudserayudante solicitudserAyudante;
        final String nombreActividad = Constantes.SolicitarSerAyudante.solicitarAyudantia;
      
        try {
            nombreInstanciaProcesoProf = getNombreInstanciaSolicitarAyudantes();
             //Verificamos si el estudiante no ha subido aun una solicitud de ayudantia  
             String usuarioNombre = this.usuario.getUsuario();
             boolean existe = logica.getLogAyudantia().aplicoASolicitudAyudantia(usuarioNombre, nombreInstanciaProcesoProf);
            if (existe == true) {
                throw new MensajeException("Usted ya inicio una solicitud para aplicar a la ayudantía. ");
            }
                this.inicializarInstancia(nombreInstanciaProcesoProf);
            int idSolicitudAyudantiaPrincipal = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
           Solicitudayudantia solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitudAyudantiaPrincipal);
            int idSolicitudAyudantiaSecundaria = Integer.parseInt((String) prjSession.getNodeProperty(nombreActividadRegistro, Constantes.Atributo.idSolicitudActividad).getTheValue());
            expiroAyudantia();
             if (!gui.getFileUpload1().getValueAsString(facesContext).equals("")
             && solicitudAyudantia.getRequiereAdjunto()) {
                    String nombreArchivo = (String) gui.getFileUpload1().getValueAsString(facesContext);
                    if (nombreArchivo.indexOf(nombreProceso) >= 0) {
                        throw new MensajeException("El nombre del archivo no es válido.");
                    }
                }
            nombreInstanciaProceso = prjSession.instantiateProject(nombreProceso, Constantes.Modelo.version_SolicitarSerAyudante);
            actividad = prjSession.getNodeValue(nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }

            solicitudserAyudante = leerDatosEstudianteSolicitaSerAyudante(nombreInstanciaProceso, solicitudAyudantia);
            solicitudserAyudante.setFkIdSolicitudAyudantia(idSolicitudAyudantiaPrincipal);
            solicitudserAyudante.setNombreinstanciaproceso(nombreInstanciaProceso);           
            solicitudserAyudante = logica.getLogAyudantia().nuevoSolicitudserayudante(solicitudserAyudante); 
             prjSession.setProperty(Constantes.Atributo.idSolicitudProceso, solicitudserAyudante.getIdSolicitudSerAyudante() + "");
            solicitudserAyudante.setFkIdSolicitudAyudantia(idSolicitudAyudantiaSecundaria);
            solicitudserAyudante=logica.getLogAyudantia().clonarSolicitudserayudante(solicitudserAyudante);                      
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitudserAyudante.getIdSolicitudSerAyudante() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            return true;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_EstudianteSolicitaSerAyudante.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    private Solicitudserayudante leerDatosEstudianteSolicitaSerAyudante(String nombreInstanciaProceso, Solicitudayudantia solicitudAyudantia) throws MensajeException, Exception {
  Estudiante estudiante;
   String usuarioNombre = this.usuario.getUsuario();
        Solicitudserayudante solicitudSerAyudante = new Solicitudserayudante();
        solicitudSerAyudante.setHorasDisponibilidad((Integer) gui.getTextField1().getText());
        solicitudSerAyudante.setMensajeParaProfesor((String) gui.getTextArea2().getText());
         estudiante = logica.leerEstudiantePorUsuario(usuarioNombre);
            solicitudSerAyudante.setFkIdEstudiante(estudiante.getIdEstudiante());
            solicitudSerAyudante.setEstado(Constantes.EstadoSolicitud.Activa.toString());
        try {
            if (!gui.getFileUpload1().getValueAsString(facesContext).equals("")
                    && solicitudAyudantia.getRequiereAdjunto()) {
                
                String nombreArchivo = (String) gui.getFileUpload1().getValueAsString(facesContext);
                solicitudSerAyudante.setNombreArchivo(nombreArchivo);
                UploadedFile uploadedFile = gui.getFileUpload1().getUploadedFile();

                HttpServletRequest servletRequest = (HttpServletRequest) externalContext.getRequest();
                String pathRaiz = (String) servletRequest.getAttribute("path");
                String pathCarpetas = "/" + "Archivos" + "/" + "Solicitar Ser Ayudante";
                File carpeta = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso);
                carpeta.mkdirs();

                File file = new File(pathRaiz + pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo);
                uploadedFile.write(file);
                String relativePath = pathCarpetas + "/" + nombreInstanciaProceso + "/" + nombreArchivo;
                solicitudSerAyudante.setPathArchivoAdjunto(relativePath);
                System.out.println("relativePath" + relativePath);
            }
            return solicitudSerAyudante;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_EstudianteSolicitaSerAyudante.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }

    }
}
